2017-09-05 33 views
0

使用如下代码:”没有开始交换。“错误的序列化EdiMessage

... 
EdiMessage ediMessage = (EdiMessage)instance; 
using (FileStream ediStream = File.OpenWrite(file)) 
{ 
    using (EdifactWriter writer = new EdifactWriter(ediStream)) 
    { 
     writer.Write(ediMessage); 
    } 
} 

我收到错误消息“没有交换开始。”

堆栈跟踪writer.Write调用下面(最后一次公开版Edifabric的):

at EdiFabric.Framework.Writers.EdiWriter`2.Write(EdiMessage message) 

它涉及与BGM,一些FTX和UNH一个D96A INVOIC对象。对象类是。 EdiWriter在电话writer.Write上提出异常。

ediMessage内容似乎有效。据Edifabric documentation它会自动添加默认EDIFACT分隔符:

如果没有明确指定笔者将使用每个标准默认的分隔符:

我忘记什么设置?

+0

消息 '无交换开始'。意味着没有创建交换头段。 EDI文件采用如下结构:互换标题 - >群组标题(EDIFACT可选) - >交易 - >群组预告 - >交换预告。在你的情况下,你需要先写一个UNB然后写所有的transactions \ messages。 –

+0

@DonZoeggerle谢谢你的背景;错误中的“交换”一词是由于缺乏EDIFACT术语,当时我不清楚。有了一些额外的灰色单元格,我现在知道它指的是EDI消息交换。 EDIFACT效果很好;简单,优雅的设计! –

回答

0

这似乎是一个文档错误;违约不会发生。将代码更改为:

using (EdifactWriter writer = new EdifactWriter(ediStream)) 
{ 
    var unb = new UNB(); // Begin interchange. 
    writer.Write(unb, Separators.Edifact); 

    writer.Write(ediMessage); 
} 

unb在文档中插入一个标头,在此之后添加一条消息。该代码现在提出了“对象引用未设置为对象的实例”。与固定通过将调用堆栈

at EdiFabric.Core.Model.Edi.EdiMessage.GetControlNumber(String tag, Int32 position) 

ediMessage.ControlNumber = ...; 
+0

是的,所有级别的控制号码都是强制性的。不要忘记在写信之前验证你的信息。 –

+0

@DonZoeggerle谢谢你的提示。我会看看如何验证它。我们现在只检查错误。 –